package model;

import bledy.RezerwacjaException;
import dataXML.Element;
import dataXML.Zapytanie;
import datamodel.Kryteria;
import datamodel.Sala;
import datamodel.Rezerwacja;
import datamodel.ZbiorRezerwacji;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

// #[regen=yes,id=DCE.2A5D8A8B-33A2-D3FB-D17F-0FF0A50EDF3C]
import java.util.logging.Level;
import java.util.logging.Logger;
// </editor-fold> 
public class ParserDoWebService {
    
    private WebService webService;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.EF75F387-C64F-B478-0518-AFB069D65678]
    // </editor-fold> 
    private static ParserDoWebService uniqueInstance;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.87EC9BE8-4BA0-8F6C-D909-F4C033D0DDCC]
    // </editor-fold> 
    private ParserDoWebService () {
        webService = WebService.instance();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.1C5F2EF1-FFE9-2CC2-D697-0510C5FC8B24]
    // </editor-fold> 
    public static ParserDoWebService instance () {
        if (uniqueInstance == null ){
            uniqueInstance = new ParserDoWebService();
        }
        return uniqueInstance;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.BE24AC3E-BEF4-68FB-CE09-29EE5A9732F9]
    // </editor-fold> 
    public void zarezerwujSale (ZbiorRezerwacji zbiorRezerwacji) throws RezerwacjaException {
        
        dataXML.Zapytanie zapytanie = stworzZapytanie(zbiorRezerwacji);
        try {            
            javax.xml.bind.JAXBContext jaxbCtx = javax.xml.bind.JAXBContext.newInstance(zapytanie.getClass().getPackage().getName());
            javax.xml.bind.Marshaller marshaller = jaxbCtx.createMarshaller();
            marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "UTF-8"); //NOI18N

            marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            StringWriter stringWriter = new StringWriter();
            marshaller.marshal(zapytanie, new FileOutputStream("E:/zapytanie.xml"));
            System.out.println(stringWriter.toString());
        } catch (javax.xml.bind.JAXBException ex) {
            // XXXTODO Handle exception
            java.util.logging.Logger.getLogger("global").log(java.util.logging.Level.SEVERE, null, ex); //NOI18N

        }
        catch (FileNotFoundException ex) {
                Logger.getLogger(ParserDoWebService.class.getName()).log(Level.SEVERE, null, ex);
            }
        
        //webService.zarezerwujSale(params);
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.EDE0D9DF-5771-0560-7B74-AAFADAB33B10]
    // </editor-fold> 
    public void usunRezerwacje (Rezerwacja rezerwacja) {
        
        ArrayList<String> params = new ArrayList<String>();
        // przetworz obiekty rezerwacji na odpowiednie 'Stringowe' zapytanie
        
        webService.usunRezerwacje(params);
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.9F57BEE2-12D5-6D4B-59D8-6BCBF49DCDE8]
    // </editor-fold> 
    public List<Rezerwacja> podajOblozenieSal (Kryteria kryteria) {
        
        ArrayList<String> params = new ArrayList<String>();
        // przetworz kryteria tak by uzyskać odpowiednie zapytanie, które można
        // wysłać do WebService
        
        String odpowiedz = webService.podajOblozenieSal(params);
        // dalej przetwórz odpowiedź
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.EC0ED48D-2C7D-B115-E7DF-553A01CA5245]
    // </editor-fold> 
    public List<Sala> podajListeSal () {
        String odpowiedz = webService.podajListeSal();
        // dalej przetwórz odpowiedz
        return null;
    }
    
    private dataXML.Osoba stowrzOsobe(datamodel.Osoba osoba){
        dataXML.Osoba osoba1 = new dataXML.Osoba(osoba.getIdOsoby(),osoba.getNazwa());
        return osoba1;
    } 
    
    private dataXML.OkresCzasu stowrzOkresCzasu(datamodel.OkresCzasu okresCzasu){
        dataXML.PunktWCzasie pocz = stowrzPunktWCzasie(okresCzasu.getPoczatek());
        dataXML.PunktWCzasie kon = stowrzPunktWCzasie(okresCzasu.getKoniec());
        dataXML.OkresCzasu okresCzasu1 = new dataXML.OkresCzasu(pocz, kon);
        return okresCzasu1;
    }
     
     private dataXML.PunktWCzasie stowrzPunktWCzasie(datamodel.PunktWCzasie punktWCzasie){
        dataXML.PunktWCzasie punktWCzasie1 = new dataXML.PunktWCzasie(punktWCzasie.getRok(), 
                                                                punktWCzasie.getMiesiac(),
                                                                punktWCzasie.getDzien(),
                                                                punktWCzasie.getGodzina(),
                                                                punktWCzasie.getMinuta());
        return punktWCzasie1;
    }
     
    private dataXML.Sala stworzSale(datamodel.Sala sala){
        dataXML.Sala sala1 = new dataXML.Sala(sala.getIdSali());
        return sala1;
    }
    
    private dataXML.Element stworzElement(datamodel.Rezerwacja rezerwacja){
       
        dataXML.Element element = new dataXML.Element();
        dataXML.OkresCzasu okresCzasu = new dataXML.OkresCzasu();
        dataXML.Osoba osoba = new dataXML.Osoba();
        dataXML.Sala sala = new dataXML.Sala();
        
        boolean czyZar = rezerwacja.getZarezerwowana();
        String opis = rezerwacja.getPowod();
        datamodel.Osoba osoba1 = rezerwacja.getRezerwujacy();
 
        osoba = stowrzOsobe(osoba1); 
        element.setCzyZarezerwowany(czyZar);
        element.setOpis(opis);
        element.setRezerwujacy(osoba);
        Sala sala1 = rezerwacja.getSala();
        sala = stworzSale(sala1);
        element.setSala(sala);
           
        datamodel.OkresCzasu okresCzasu1 = rezerwacja.getCzas();
        okresCzasu = stowrzOkresCzasu(okresCzasu1);
        element.setOkresCzasu(okresCzasu);
        
        return element;         
    }
    
    
     
     
    public dataXML.Zapytanie stworzZapytanie(datamodel.ZbiorRezerwacji zbiorRezerwacji){
        
        ArrayList<dataXML.Element> elements = new ArrayList<dataXML.Element>(); 
        
        ArrayList<datamodel.Rezerwacja> rezerwacjas = zbiorRezerwacji.getRezerwacjas();
        
        for (Iterator<Rezerwacja> it = rezerwacjas.iterator(); it.hasNext();) {
            Rezerwacja rezerwacja = it.next();
            elements.add(stworzElement(rezerwacja));
        }
       
        dataXML.Zapytanie zapytanie = new Zapytanie(elements);
        return zapytanie;
    }
    
    
    
    
    private datamodel.Osoba stowrzOsobe(dataXML.Osoba osoba){
        datamodel.Osoba osoba1 = new datamodel.Osoba(osoba.getIdOsoby(),osoba.getNazwa());
        return osoba1;
    } 
    
    private datamodel.OkresCzasu stowrzOkresCzasu(dataXML.OkresCzasu okresCzasu){
        datamodel.PunktWCzasie pocz = stowrzPunktWCzasie(okresCzasu.getPoczatek());
        datamodel.PunktWCzasie kon = stowrzPunktWCzasie(okresCzasu.getKoniec());
        datamodel.OkresCzasu okresCzasu1 = new datamodel.OkresCzasu(pocz, kon);
        return okresCzasu1;
    }
     
     private datamodel.PunktWCzasie stowrzPunktWCzasie(dataXML.PunktWCzasie punktWCzasie){
        datamodel.PunktWCzasie punktWCzasie1 = new datamodel.PunktWCzasie(punktWCzasie.getRok(), 
                                                                punktWCzasie.getMiesiac(),
                                                                punktWCzasie.getDzien(),
                                                                punktWCzasie.getGodzina(),
                                                                punktWCzasie.getMinuta());
        return punktWCzasie1;
    }
     
    private datamodel.Sala stworzSale(dataXML.Sala sala){
        datamodel.Sala sala1 = new datamodel.Sala(sala.getIdSali());
        return sala1;
    }
    
    
     
     
    public datamodel.Rezerwacja stworzRezerwacje(Element element){
        
        datamodel.OkresCzasu okresCzasu = new datamodel.OkresCzasu();
        datamodel.Osoba osoba = new datamodel.Osoba();
        datamodel.Sala sala = new datamodel.Sala();
        datamodel.Rezerwacja rezerwacja= new datamodel.Rezerwacja();
         
        boolean czyZar = element.isCzyZarezerwowany();
        String opis = element.getOpis();
        dataXML.Osoba osoba1 = element.getRezerwujacy();
        osoba = stowrzOsobe(osoba1); 
        okresCzasu = stowrzOkresCzasu(element.getOkresCzasu());
        sala = stworzSale(element.getSala());
        
        rezerwacja.setZarezerwowana(czyZar);
        rezerwacja.setPowod(opis);
        rezerwacja.setRezerwujacy(osoba);
        rezerwacja.setSala(sala);
        rezerwacja.setCzas(okresCzasu);
        
        return rezerwacja;
    }
    
    
    
    
    

}

